# sorted()
'''
sorted()
把可迭代数据里面的元素，一个一个的取出来，放到key函数中进行处理，
并按照函数中return的结果进行排序，返回一个新的列表
功能：排序
参数：
    iterable 可迭代的数据（容器类型数据，range数据序列，迭代器）
    reverse 可选，是否反转，默认False
    key 可选，函数，可以是自定义函数，也可以是内置函数
返回值：排序后的结果
'''
arr = [3, 4, 7, 1, -9, 10, -2, 5]

res = sorted(arr)
# print(res)
# [-9, -2, 1, 3, 4, 5, 7, 10]

# print(sorted(arr, reverse=True))
# [10, 7, 5, 4, 3, 1, -2, -9]

# print(sorted(arr, key=abs))
# [1, -2, 3, 4, 5, 7, -9, 10]

def m2(num):
    return num % 2

# print(sorted(arr, key=m2))
# [4, 10, -2, 3, 7, 1, -9, 5]

# print(sorted(arr, key=lambda num: num % 2))
# [4, 10, -2, 3, 7, 1, -9, 5]
# print(sorted(arr, reverse=True, key=lambda num: num % 2))
# [3, 7, 1, -9, 5, 4, 10, -2] 对2取余的结果反序排序


# map()
'''
map(func, *iterables)
对传入的可迭代数据中的每一个元素进行处理，返回一个迭代器
参数：
    func: 自定义/内置函数
    iterables: 可迭代数据
返回值：迭代器
'''
varl = ['1', '2', '3', '4', '5']
newList = []
for i in varl:
    newList.append(int(i))
# print(newList)
# [1, 2, 3, 4, 5]

res = map(int, varl)
# print(res)
# <map object at 0x000001E227BE25F0>
# print(list(res))
# [1, 2, 3, 4, 5]

varl = [1, 2, 3, 4]
def pow2(num):
    return num * num
res = map(pow2, varl)
# print(list(res))
# [1, 4, 9, 16]
res = map(lambda num: num ** 2, varl)
# print(list(res))
# [1, 4, 9, 16]

# ['a', 'b', 'c', 'd'] ===> [97, 98, 99, 100]
varl = ['a', 'b', 'c', 'd']
res = map(ord, varl)
# print(list(res))
# [97, 98, 99, 100]

# reduce()
# 首先导入
from functools import reduce
'''
reduce(func, *iterable)
    每一次从iterable中拿出两个元素，放入func函数中进行处理，得到一个结果
    然后把这个结果和第三个元素放入到func函数中进行处理，
    依次类推，直到最后一个元素参与了运算
参数：
    func：自定义/内置函数
    iterable：可迭代数据
返回值：最终运算结果
注意：使用reduce时需要导入  from functools import reduce
'''

# [5, 2, 1, 1] ===> 5211
varl = [5, 2, 1, 1]
res = reduce(lambda num1, num2: str(num1)+str(num2), varl)
# print(int(res))
# 5211

# '456' ===> 456 不能使用int方法
vars = '456'

# 使用int方法
# res = reduce(lambda num1, num2: int(num1)*10+int(num2), vars)

# 不使用int方法
varDict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def func(num1, num2):
    resNum1 = num1
    resNum2 = varDict[num2]
    if isinstance(num1, str):
        resNum1 = varDict[num1]
        return resNum1*10+resNum2
    else:
        return resNum1*10+resNum2

res = reduce(func, vars)
# print(res)
# 456

# map与reduce结合
def func(s):
    varDict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return varDict[s]

varl = list(map(func, vars))
res = reduce(lambda num1, num2: num1*10+num2, varl)
# print(res)
# 456


# filter()
'''
filter(func, *iterable) 过滤函数
    过滤数据，把iterable中的每个人元素，拿到func函数中进行处理，
    如果函数返回True则保留数据，返回False则丢弃这个数据
参数：
    func: 自定义或者内置函数
    iterable: 可迭代对象
返回值：保留下来的数据组成的迭代器
'''

varl = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 保留偶数
# 普通方法实现
newList = []
for i in varl:
    if i % 2 == 0:
        newList.append(i)

print(newList)
# [2, 4, 6, 8]

# 使用filter函数
res = filter(lambda num: num % 2 != 1, varl)
print(list(res))
# [2, 4, 6, 8]


